์ธ๊ธฐ ์๋ ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ธ Styled Components์ Emotion์ ํฌ๊ด์ ์ธ ์ฑ๋ฅ ๋น๊ต๋ฅผ ํตํด ๊ฐ๋ฐ์๊ฐ ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์ ์ ์ ํํ๋๋ก ๋์ต๋๋ค.
CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ: Styled Components vs Emotion ์ฑ๋ฅ ๋ถ์
CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๊ฐ๋ฐ์๊ฐ JavaScript ์ฝ๋ ๋ด์์ ์ง์ CSS๋ฅผ ์์ฑํ ์ ์๊ฒ ํ์ฌ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ํ๋ช ์ ์ผ์ผ์ผฐ์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ปดํฌ๋ํธ ์์ค์ ์คํ์ผ๋ง, ๋์ ํ ๋ง ์ ์ฉ, ์ ์ง๋ณด์์ฑ ํฅ์ ๋ฑ ์๋ง์ ์ด์ ์ ์ ๊ณตํฉ๋๋ค. ๊ฐ์ฅ ์ธ๊ธฐ ์๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ๋ ๊ฐ์ง๋ Styled Components์ Emotion์ ๋๋ค. ์ด ๋ ์ฌ์ด์ ์ ํ์ ์ข ์ข ๊ธฐ๋ฅ, ๊ฐ๋ฐ์ ๊ฒฝํ, ๊ทธ๋ฆฌ๊ณ ๊ฒฐ์ ์ ์ผ๋ก ์ฑ๋ฅ ๊ฐ์ ํธ๋ ์ด๋์คํ์ ๋ฐ๋ผ ๊ฒฐ์ ๋ฉ๋๋ค. ์ด ๊ธ์์๋ Styled Components์ Emotion์ ๋ํ ์์ธํ ์ฑ๋ฅ ๋ถ์์ ์ ๊ณตํ์ฌ ๋ค์ ํ๋ก์ ํธ๋ฅผ ์ํ ์ ๋ณด์ ์ ๊ฐํ ๊ฒฐ์ ์ ๋ด๋ฆฌ๋ ๋ฐ ๋์์ ๋๋ฆฝ๋๋ค.
CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ๋ฌด์์ธ๊ฐ?
์ ํต์ ์ธ CSS๋ ๋ณ๋์ .css ํ์ผ์ ์คํ์ผ์ ์์ฑํ๊ณ ์ด๋ฅผ HTML ๋ฌธ์์ ์ฐ๊ฒฐํ๋ ๋ฐฉ์์ ๋๋ค. CSS-in-JS๋ JavaScript ์ปดํฌ๋ํธ ๋ด์ CSS ๊ท์น์ ํฌํจ์์ผ ์ด ํจ๋ฌ๋ค์์ ๋ค์ง์ต๋๋ค. ์ด ์ ๊ทผ ๋ฐฉ์์ ์ฌ๋ฌ ๊ฐ์ง ์ฅ์ ์ ์ ๊ณตํฉ๋๋ค:
- ์ปดํฌ๋ํธ ๊ฒฉ๋ฆฌ: ์คํ์ผ์ด ๊ฐ๋ณ ์ปดํฌ๋ํธ๋ก ๋ฒ์๊ฐ ํ์ ๋์ด ์ด๋ฆ ์ถฉ๋ ๋ฐ ์๋์น ์์ ์คํ์ผ ์ฌ์ ์๋ฅผ ๋ฐฉ์งํฉ๋๋ค.
- ๋์ ์คํ์ผ๋ง: ์ปดํฌ๋ํธ props์ ์ํ์ ๋ฐ๋ผ CSS ์์ฑ์ ๋์ ์ผ๋ก ์กฐ์ ํ ์ ์์ต๋๋ค.
- ํ ๋ง ์ ์ฉ: ๋ณต์กํ CSS ์ ์ฒ๋ฆฌ๊ธฐ ์ค์ ์์ด๋ ๋ค์ํ ํ ๋ง๋ฅผ ์ฝ๊ฒ ๊ด๋ฆฌํ๊ณ ์ ํํ ์ ์์ต๋๋ค.
- ์ฝ๋ ๋ณ์น(Colocation): ์คํ์ผ์ด ์ปดํฌ๋ํธ ๋ก์ง๊ณผ ํจ๊ป ์์นํ์ฌ ์ฝ๋ ๊ตฌ์ฑ ๋ฐ ์ ์ง๋ณด์์ฑ์ ํฅ์์ํต๋๋ค.
- ์ฑ๋ฅ ํฅ์ (์ ์ฌ์ ): ์คํ์ผ ์ฃผ์ ์ ์ต์ ํํจ์ผ๋ก์จ CSS-in-JS๋ ํนํ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ์ ํต์ ์ธ CSS ์ ๊ทผ ๋ฐฉ์๋ณด๋ค ๋๋๋ก ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ผ ์ ์์ต๋๋ค.
ํ์ง๋ง CSS-in-JS๋ ๋ฐํ์ ์คํ์ผ ์ฒ๋ฆฌ ๋ฐ ์ฃผ์ ์ผ๋ก ์ธํด ์ ์ฌ์ ์ธ ์ฑ๋ฅ ์ค๋ฒํค๋๋ฅผ ์ ๋ฐํ๊ธฐ๋ ํฉ๋๋ค. ๋ฐ๋ก ์ด ์ง์ ์์ ์ฌ๋ฌ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ ํน์ฑ์ด ์ค์ํด์ง๋๋ค.
Styled Components
Glen Maddern๊ณผ Max Stoiber๊ฐ ๋ง๋ Styled Components๋ ๊ฐ์ฅ ๋๋ฆฌ ์ฑํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค ํ๋์ ๋๋ค. ํ๊ทธ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด์ ํ์ฉํ์ฌ JavaScript ๋ด์์ ์ง์ CSS ๊ท์น์ ์์ฑํฉ๋๋ค. Styled Components๋ ๊ฐ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ๋ํด ๊ณ ์ ํ ํด๋์ค ์ด๋ฆ์ ์์ฑํ์ฌ ๊ฒฉ๋ฆฌ๋ฅผ ๋ณด์ฅํ๊ณ ์ถฉ๋์ ๋ฐฉ์งํฉ๋๋ค.
Styled Components์ ์ฃผ์ ํน์ง:
- ํ๊ทธ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด: JavaScript ๋ด์์ ์น์ํ CSS ๊ตฌ๋ฌธ์ ์ฌ์ฉํ์ฌ CSS๋ฅผ ์์ฑํฉ๋๋ค.
- ์๋ ๋ฒค๋ ํ๋ฆฌํฝ์ฑ: ๋ธ๋ผ์ฐ์ ๊ฐ ํธํ์ฑ์ ์ํด ๋ฒค๋ ์ ๋์ฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
- ํ ๋ง ์ง์: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ์คํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ๊ฐ๋ ฅํ ํ ๋ง API๋ฅผ ์ ๊ณตํฉ๋๋ค.
- CSS Prop: CSS prop์ ์ฌ์ฉํ์ฌ ๋ชจ๋ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ ์ฉํ ์ ์์ด ์ ์ฐํ ์คํ์ผ ์ ์ฉ ๋ฐฉ๋ฒ์ ์ ๊ณตํฉ๋๋ค.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง: ํฅ์๋ SEO ๋ฐ ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ ์ํด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํธํ๋ฉ๋๋ค.
Styled Components ์์:
import styled from 'styled-components';
const Button = styled.button`
background-color: ${props => props.primary ? 'palevioletred' : 'white'};
color: ${props => props.primary ? 'white' : 'palevioletred'};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
`;
function MyComponent() {
return (
);
}
Emotion
Emotion์ ์ฑ๋ฅ๊ณผ ์ ์ฐ์ฑ์ ์ค์ ์ ๋ ๋ ๋ค๋ฅธ ์ธ๊ธฐ ์๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. ํ๊ทธ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด, ๊ฐ์ฒด ์คํ์ผ, `css` prop ๋ฑ ๋ค์ํ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์์ ์ ๊ณตํฉ๋๋ค. Emotion์ React ๋ฐ ๊ธฐํ JavaScript ํ๋ ์์ํฌ๋ฅผ ์ํ ๊ฒฝ๋์ ํจ์จ์ ์ธ ์คํ์ผ๋ง ์๋ฃจ์ ์ ์ ๊ณตํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
Emotion์ ์ฃผ์ ํน์ง:
- ๋ค์ํ ์คํ์ผ๋ง ์ ๊ทผ ๋ฐฉ์: ํ๊ทธ๋ ํ ํ๋ฆฟ ๋ฆฌํฐ๋ด, ๊ฐ์ฒด ์คํ์ผ ๋ฐ `css` prop์ ์ง์ํฉ๋๋ค.
- ์๋ ๋ฒค๋ ํ๋ฆฌํฝ์ฑ: Styled Components์ ์ ์ฌํ๊ฒ ๋ฒค๋ ์ ๋์ฌ๋ฅผ ์๋์ผ๋ก ์ถ๊ฐํฉ๋๋ค.
- ํ ๋ง ์ง์: ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ฐ์ ์คํ์ผ์ ๊ด๋ฆฌํ๊ธฐ ์ํ ํ ๋ง ์ปจํ ์คํธ๋ฅผ ์ ๊ณตํฉ๋๋ค.
- CSS Prop: `css` prop์ผ๋ก ๋ชจ๋ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ ์ฉํ ์ ์์ต๋๋ค.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง: ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง๊ณผ ํธํ๋ฉ๋๋ค.
- ๊ตฌ์ฑ(Composition): ๋ค์ํ ์์ค์ ์คํ์ผ์ ๊ตฌ์ฑํ๋ ๊ฒ์ ์ง์ํฉ๋๋ค.
Emotion ์์:
import styled from '@emotion/styled';
import { css } from '@emotion/react';
const Button = styled.button`
background-color: ${props => props.primary ? 'palevioletred' : 'white'};
color: ${props => props.primary ? 'white' : 'palevioletred'};
font-size: 1em;
margin: 1em;
padding: 0.25em 1em;
border: 2px solid palevioletred;
border-radius: 3px;
`;
function MyComponent() {
return (
Styled with CSS prop
);
}
์ฑ๋ฅ ๋ถ์: Styled Components vs Emotion
์ฑ๋ฅ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ ๋, ํนํ ๋๊ท๋ชจ์ ๋ณต์กํ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ค์ํ ์์์ ๋๋ค. Styled Components์ Emotion์ ์ฑ๋ฅ์ ํน์ ์ฌ์ฉ ์ฌ๋ก ๋ฐ ์ ํ๋ฆฌ์ผ์ด์ ์ํคํ ์ฒ์ ๋ฐ๋ผ ๋ฌ๋ผ์ง ์ ์์ต๋๋ค. ์ด ์น์ ์์๋ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํ ์์ธํ ์ฑ๋ฅ ๋ถ์์ ์ ๊ณตํ๋ฉฐ, ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ, ์ ๋ฐ์ดํธ ์ฑ๋ฅ, ๋ฒ๋ค ํฌ๊ธฐ ๋ฑ ๋ค์ํ ์ธก๋ฉด์ ๋ค๋ฃน๋๋ค.
๋ฒค์น๋งํน ๋ฐฉ๋ฒ๋ก
๊ณต์ ํ๊ณ ํฌ๊ด์ ์ธ ์ฑ๋ฅ ๋น๊ต๋ฅผ ์ํํ๋ ค๋ฉด ์ผ๊ด๋ ๋ฒค์น๋งํน ๋ฐฉ๋ฒ๋ก ์ด ํ์ํฉ๋๋ค. ์ฃผ์ ๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ํ์ค์ ์ธ ์๋๋ฆฌ์ค: ๋ฒค์น๋งํฌ๋ ๋ณต์กํ ์ปดํฌ๋ํธ ๋ ๋๋ง, ๋์ ์คํ์ผ ์ ๋ฐ์ดํธ, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ ์ฒ๋ฆฌ ๋ฑ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์๋๋ฆฌ์ค๋ฅผ ์๋ฎฌ๋ ์ด์ ํด์ผ ํฉ๋๋ค. ์ ์์๊ฑฐ๋ ์ ํ ๋ชฉ๋ก, ๋ฐ์ดํฐ ๋์๋ณด๋, ์ฝํ ์ธ ์ค์ฌ ์น์ฌ์ดํธ ๋ฑ ๋ค์ํ ์ ํ์ ์ ํ๋ฆฌ์ผ์ด์ ๊ณผ ๊ด๋ จ๋ ์๋๋ฆฌ์ค๋ฅผ ๊ณ ๋ คํ์ธ์.
- ์ผ๊ด๋ ํ๊ฒฝ: ํ๋์จ์ด, ์ด์ ์ฒด์ , ๋ธ๋ผ์ฐ์ ๋ฒ์ ์ ํฌํจํ์ฌ ๋ชจ๋ ๋ฒค์น๋งํฌ์์ ์ผ๊ด๋ ํ ์คํธ ํ๊ฒฝ์ ๋ณด์ฅํ์ธ์. Docker์ ๊ฐ์ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ผ๊ด์ฑ์ ๋ณด์ฅํ๋ ๋ฐ ๋์์ด ๋ ์ ์์ต๋๋ค.
- ์ฌ๋ฌ ๋ฒ ์คํ: ๋ณ๋์ ๊ณ ๋ คํ๊ณ ์ด์์น์ ์ํฅ์ ์ค์ด๊ธฐ ์ํด ๊ฐ ๋ฒค์น๋งํฌ๋ฅผ ์ฌ๋ฌ ๋ฒ ์คํํ์ธ์. ๊ฒฐ๊ณผ์ ํ๊ท ๊ณผ ํ์ค ํธ์ฐจ๋ฅผ ๊ณ์ฐํ์ธ์.
- ์ฑ๋ฅ ์งํ: ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ, ์ ๋ฐ์ดํธ ์๊ฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋, ๋ฒ๋ค ํฌ๊ธฐ์ ๊ฐ์ ํต์ฌ ์ฑ๋ฅ ์งํ๋ฅผ ์ธก์ ํ์ธ์. ๋ธ๋ผ์ฐ์ ๊ฐ๋ฐ์ ๋๊ตฌ(์: Chrome DevTools ์ฑ๋ฅ ํญ)์ ํ๋กํ์ผ๋ง ๋๊ตฌ๋ฅผ ์ฌ์ฉํ์ฌ ์ ํํ ๋ฐ์ดํฐ๋ฅผ ์์งํ์ธ์.
- ์ฝ๋ ๋ถํ (Code Splitting): ์ฝ๋ ๋ถํ ์ด ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ๋ฏธ์น๋ ์ํฅ์ ํ๊ฐํ์ธ์.
- ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง: ์๋ฒ ๋ ๋๋ง ํ๊ฒฝ์์ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฑ๋ฅ์ ํ๊ฐํ๊ธฐ ์ํด ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ๋ฒค์น๋งํฌ๋ฅผ ํฌํจํ์ธ์.
ํต์ฌ ์ฑ๋ฅ ์งํ
- ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ: ์ด๊ธฐ ํ์ด์ง๋ ์ปดํฌ๋ํธ๋ฅผ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค. ์ด๋ ์ฌ์ฉ์๊ฐ ์ธ์งํ๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ก๋ฉ ์๋์ ์ง์ ์ ์ธ ์ํฅ์ ๋ฏธ์น๋ฏ๋ก ์ฌ์ฉ์ ๊ฒฝํ์ ์์ด ์ค์ํ ์งํ์ ๋๋ค.
- ์ ๋ฐ์ดํธ ์๊ฐ: ์ปดํฌ๋ํธ์ props๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์คํ์ผ์ ์ ๋ฐ์ดํธํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค. ์ด ์งํ๋ UI ์ ๋ฐ์ดํธ๊ฐ ์ฆ์ ๋ํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํฉ๋๋ค.
- ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋: ๋ ๋๋ง ๋ฐ ์ ๋ฐ์ดํธ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋๋ค. ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํนํ ์ ์ฌ์ ๊ธฐ๊ธฐ์์ ์ฑ๋ฅ ๋ฌธ์ ์ ์ถฉ๋์ ์ผ์ผํฌ ์ ์์ต๋๋ค.
- ๋ฒ๋ค ํฌ๊ธฐ: ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ด๋ก๋ํด์ผ ํ๋ JavaScript ๋ฒ๋ค์ ํฌ๊ธฐ์ ๋๋ค. ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์์์๋ก ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๋นจ๋ผ์ง๊ณ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์์ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
- CSS ์ฃผ์ ์๋: CSS ๊ท์น์ด DOM์ ์ฃผ์ ๋๋ ์๋์ ๋๋ค. ์ด๋ ํนํ ์คํ์ผ์ด ๋ง์ ์ปดํฌ๋ํธ์์ ๋ณ๋ชฉ ํ์์ด ๋ ์ ์์ต๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ: ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ
์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ์ฒด๊ฐ ์ฑ๋ฅ์ ์์ด ์ค์ํ ์งํ์ ๋๋ค. ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ด ๋๋ฆฌ๋ฉด ํนํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ๋ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์์ ์ฌ์ฉ์ ๊ฒฝํ์ด ์ ํ๋ ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, ๋ง์ ์๋๋ฆฌ์ค์์ Emotion์ด Styled Components๋ณด๋ค ์ฝ๊ฐ ๋ ๋น ๋ฅธ ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ ๋ณด์ด๋ ๊ฒฝํฅ์ด ์์ต๋๋ค. ์ด๋ ์ข ์ข Emotion์ ๋ ํจ์จ์ ์ธ ์คํ์ผ ์ฃผ์ ๋ฉ์ปค๋์ฆ ๋๋ถ์ ๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ์ ์ฐจ์ด๊ฐ ๋ฏธ๋ฏธํ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ๋ ๋๋งํ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ๋ง์์ง์๋ก ๊ทธ ์ํฅ์ ๋ ๋๋๋ฌ์ง๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ: ์ ๋ฐ์ดํธ ์๊ฐ
์ ๋ฐ์ดํธ ์๊ฐ์ ์ปดํฌ๋ํธ์ props๋ ์ํ๊ฐ ๋ณ๊ฒฝ๋ ๋ ์ปดํฌ๋ํธ๋ฅผ ๋ค์ ๋ ๋๋งํ๋ ๋ฐ ๊ฑธ๋ฆฌ๋ ์๊ฐ์ ๋๋ค. ์ด๋ UI ์ ๋ฐ์ดํธ๊ฐ ์ฆ์ ๋ํํ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ค์ํ ์งํ์ ๋๋ค.
Emotion์ ์ข ์ข Styled Components๋ณด๋ค ๋ ๋์ ์ ๋ฐ์ดํธ ์ฑ๋ฅ์ ๋ณด์ฌ์ค๋๋ค. Emotion์ ์ต์ ํ๋ ์คํ์ผ ์ฌ๊ณ์ฐ ๋ฐ ์ฃผ์ ์ด ๋ ๋น ๋ฅธ ์ ๋ฐ์ดํธ์ ๊ธฐ์ฌํฉ๋๋ค.
Styled Components๋ ๋ณต์กํ ๊ณ์ฐ์ด๋ prop ๋ณ๊ฒฝ์ ์์กดํ๋ ์คํ์ผ์ ์ ๋ฐ์ดํธํ ๋ ๋๋๋ก ์ฑ๋ฅ ๋ณ๋ชฉ ํ์์ ๊ฒช์ ์ ์์ต๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋ฉ๋ชจ์ด์ ์ด์ ๋ฐ shouldComponentUpdate์ ๊ฐ์ ๊ธฐ์ ์ ์ฌ์ฉํ์ฌ ์ํํ ์ ์์ต๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ: ๋ฒ๋ค ํฌ๊ธฐ
๋ฒ๋ค ํฌ๊ธฐ๋ ๋ธ๋ผ์ฐ์ ๊ฐ ๋ค์ด๋ก๋ํด์ผ ํ๋ JavaScript ๋ฒ๋ค์ ํฌ๊ธฐ์ ๋๋ค. ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์์์๋ก ์ด๊ธฐ ๋ก๋ฉ ์๊ฐ์ด ๋นจ๋ผ์ง๊ณ ํนํ ๋๋ฆฐ ๋คํธ์ํฌ ์ฐ๊ฒฐ์์ ์ฑ๋ฅ์ด ํฅ์๋ฉ๋๋ค.
Emotion์ ์ผ๋ฐ์ ์ผ๋ก Styled Components๋ณด๋ค ๋ฒ๋ค ํฌ๊ธฐ๊ฐ ์์ต๋๋ค. ์ด๋ Emotion์ด ๋ ๋ชจ๋ํ๋ ์ํคํ ์ฒ๋ฅผ ๊ฐ์ง๊ณ ์์ด ๊ฐ๋ฐ์๊ฐ ํ์ํ ๊ธฐ๋ฅ๋ง ๊ฐ์ ธ์ฌ ์ ์๊ธฐ ๋๋ฌธ์ ๋๋ค. ๋ฐ๋ฉด์ Styled Components๋ ๋ ๋ง์ ๊ธฐ๋ฅ์ ๊ธฐ๋ณธ์ ์ผ๋ก ํฌํจํ๋ ๋ ํฐ ์ฝ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ์ง๊ณ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ์ค์ ๊ท๋ชจ์ ์ ํ๋ฆฌ์ผ์ด์ ์์๋ ๋ฒ๋ค ํฌ๊ธฐ์ ์ฐจ์ด๊ฐ ํฌ์ง ์์ ์ ์์ต๋๋ค. ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํ๊ณ ์ปดํฌ๋ํธ์ ์ข ์์ฑ์ด ๋ง์์ง์๋ก ๊ทธ ์ํฅ์ ๋ ๋์ ๋๊ฒ ๋ฉ๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ: ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋
๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ ๋๋ง ๋ฐ ์ ๋ฐ์ดํธ ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์ด ์๋นํ๋ ๋ฉ๋ชจ๋ฆฌ์ ์์ ๋๋ค. ๋์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ํนํ ์ ์ฌ์ ๊ธฐ๊ธฐ์์ ์ฑ๋ฅ ๋ฌธ์ , ์ถฉ๋, ๋๋ฆฐ ๊ฐ๋น์ง ์ปฌ๋ ์ ์ผ๋ก ์ด์ด์ง ์ ์์ต๋๋ค.
์ผ๋ฐ์ ์ผ๋ก, Emotion์ Styled Components์ ๋นํด ์ฝ๊ฐ ๋ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ๋ณด์ ๋๋ค. ์ด๋ ํจ์จ์ ์ธ ๋ฉ๋ชจ๋ฆฌ ๊ด๋ฆฌ ๋ฐ ์คํ์ผ ์ฃผ์ ๊ธฐ์ ๋๋ถ์ ๋๋ค.
๊ทธ๋ฌ๋ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ฐจ์ด๋ ๋๋ถ๋ถ์ ์ ํ๋ฆฌ์ผ์ด์ ์์ ์ฃผ์ ๊ด์ฌ์ฌ๊ฐ ์๋ ์ ์์ต๋๋ค. ๋ณต์กํ UI, ๋๊ท๋ชจ ๋ฐ์ดํฐ ์ธํธ๋ฅผ ๊ฐ์ง ์ ํ๋ฆฌ์ผ์ด์ ์ด๋ ๋ฆฌ์์ค๊ฐ ์ ํ๋ ๊ธฐ๊ธฐ์์ ์คํ๋๋ ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ฒฝ์ฐ ๋ ์ค์ํด์ง๋๋ค.
์ค์ ์ฌ๋ก ๋ฐ ์ผ์ด์ค ์คํฐ๋
ํฉ์ฑ ๋ฒค์น๋งํฌ๋ ์ ์ฉํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํ์ง๋ง, ์ค์ ์ ํ๋ฆฌ์ผ์ด์ ์์ Styled Components์ Emotion์ด ์ด๋ป๊ฒ ์๋ํ๋์ง ์ดํดํ๋ ค๋ฉด ์ค์ ์ฌ๋ก์ ์ผ์ด์ค ์คํฐ๋๋ฅผ ๊ณ ๋ คํ๋ ๊ฒ์ด ์ค์ํฉ๋๋ค. ๋ค์์ ๋ช ๊ฐ์ง ์์ ๋๋ค:
- ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ: ๋ณต์กํ ์ ํ ๋ชฉ๋ก๊ณผ ๋์ ํํฐ๋ง์ด ์๋ ์ ์์๊ฑฐ๋ ์น์ฌ์ดํธ๋ Emotion์ ๋ ๋น ๋ฅธ ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ๊ณผ ์ ๋ฐ์ดํธ ์ฑ๋ฅ์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค. ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ๋ ํนํ ๋ชจ๋ฐ์ผ ๊ธฐ๊ธฐ ์ฌ์ฉ์์๊ฒ ์ฒด๊ฐ ๋ก๋ฉ ์๋๋ฅผ ํฅ์์ํฌ ์๋ ์์ต๋๋ค.
- ๋ฐ์ดํฐ ๋์๋ณด๋: ์ค์๊ฐ ์ ๋ฐ์ดํธ์ ๋ํํ ์ฐจํธ๊ฐ ์๋ ๋ฐ์ดํฐ ๋์๋ณด๋๋ Emotion์ ์ต์ ํ๋ ์ ๋ฐ์ดํธ ์ฑ๋ฅ์ ํ์ฉํ์ฌ ๋ ์ํํ ์ฌ์ฉ์ ๊ฒฝํ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
- ์ฝํ ์ธ ์ค์ฌ ์น์ฌ์ดํธ: ์๋ง์ ์ปดํฌ๋ํธ์ ์คํ์ผ์ด ์๋ ์ฝํ ์ธ ์ค์ฌ ์น์ฌ์ดํธ๋ Emotion์ ๋ ์์ ๋ฒ๋ค ํฌ๊ธฐ์ ๋ฎ์ ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋์ ์ด์ ์ ๋๋ฆด ์ ์์ต๋๋ค.
- ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ : ๋๊ท๋ชจ ์ํฐํ๋ผ์ด์ฆ ์ ํ๋ฆฌ์ผ์ด์ ์ ์ข ์ข ๊ฒฌ๊ณ ํ๊ณ ํ์ฅ ๊ฐ๋ฅํ ์คํ์ผ๋ง ์๋ฃจ์ ์ด ํ์ํฉ๋๋ค. Styled Components์ Emotion ๋ชจ๋ ์ ํฉํ ์ ํ์ด ๋ ์ ์์ง๋ง, ์ ํ๋ฆฌ์ผ์ด์ ์ ๋ณต์ก์ฑ์ด ์ฆ๊ฐํจ์ ๋ฐ๋ผ Emotion์ ์ฑ๋ฅ ์ด์ ์ด ๋ ๋๋๋ฌ์ง ์ ์์ต๋๋ค.
์ฌ๋ฌ ํ์ฌ๊ฐ ํ๋ก๋์ ํ๊ฒฝ์์ Styled Components์ Emotion์ ์ฌ์ฉํ ๊ฒฝํ์ ๊ณต์ ํ์ต๋๋ค. ์ด๋ฌํ ์ผ์ด์ค ์คํฐ๋๋ ์ข ์ข ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ค์ ์ฑ๋ฅ๊ณผ ํ์ฅ์ฑ์ ๋ํ ๊ท์คํ ํต์ฐฐ๋ ฅ์ ์ ๊ณตํฉ๋๋ค. ์๋ฅผ ๋ค์ด, ์ผ๋ถ ํ์ฌ๋ Styled Components์์ Emotion์ผ๋ก ๋ง์ด๊ทธ๋ ์ด์ ํ ํ ์๋นํ ์ฑ๋ฅ ํฅ์์ ๋ณด๊ณ ํ์ผ๋ฉฐ, ๋ค๋ฅธ ํ์ฌ๋ค์ ํน์ ์๊ตฌ์ Styled Components๊ฐ ๋ ์ ํฉํ ์ ํ์์ ๋ฐ๊ฒฌํ์ต๋๋ค.
Styled Components๋ฅผ ์ํ ์ต์ ํ
Emotion์ด ํน์ ์๋๋ฆฌ์ค์์ ์ข ์ข Styled Components๋ณด๋ค ์ฑ๋ฅ์ด ๋ฐ์ด๋์ง๋ง, Styled Components์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ๋ช ๊ฐ์ง ์ต์ ํ ๊ธฐ์ ์ด ์์ต๋๋ค:
- `shouldComponentUpdate` ๋๋ `React.memo` ์ฌ์ฉ: `shouldComponentUpdate`๋ฅผ ๊ตฌํํ๊ฑฐ๋ `React.memo`๋ฅผ ์ฌ์ฉํ์ฌ ์ ๋ฐ์ดํธํ ํ์๊ฐ ์๋ ์ปดํฌ๋ํธ๋ฅผ ๋ฉ๋ชจ์ด์ฆํ์ฌ ๋ถํ์ํ ๋ฆฌ๋ ๋๋ง์ ๋ฐฉ์งํฉ๋๋ค.
- ์ธ๋ผ์ธ ์คํ์ผ ํผํ๊ธฐ: ์ธ๋ผ์ธ ์คํ์ผ์ CSS-in-JS์ ์ด์ ์ ์ฐํํ๊ณ ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ผ๋ฏ๋ก ์ฌ์ฉ์ ์ต์ํํฉ๋๋ค.
- CSS ๋ณ์ ์ฌ์ฉ: CSS ๋ณ์๋ฅผ ํ์ฉํ์ฌ ์ฌ๋ฌ ์ปดํฌ๋ํธ์์ ๊ณตํต ์คํ์ผ์ ๊ณต์ ํจ์ผ๋ก์จ ์์ฑ ๋ฐ ์ฃผ์ ํด์ผ ํ๋ CSS์ ์์ ์ค์ ๋๋ค.
- Prop ๋ณ๊ฒฝ ์ต์ํ: ์คํ์ผ ์ ๋ฐ์ดํธ๋ฅผ ์ ๋ฐํ๋ prop ๋ณ๊ฒฝ ํ์๋ฅผ ์ค์ ๋๋ค.
- `attrs` ํฌํผ ์ฌ์ฉ: `attrs` ํฌํผ๋ prop์ด ์คํ์ผ์ ์ฌ์ฉ๋๊ธฐ ์ ์ ๋ฏธ๋ฆฌ ์ฒ๋ฆฌํ์ฌ ๋ ๋๋ง ์ค์ ํ์ํ ๊ณ์ฐ๋์ ์ค์ฌ ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์์ต๋๋ค.
Emotion์ ์ํ ์ต์ ํ
๋ง์ฐฌ๊ฐ์ง๋ก Emotion์ ์ฑ๋ฅ์ ํฅ์์ํค๊ธฐ ์ํด ์ ์ฉํ ์ ์๋ ์ต์ ํ ๊ธฐ์ ์ด ์์ต๋๋ค:
- `css` Prop ์๊ปด์ ์ฌ์ฉํ๊ธฐ: `css` prop์ ์ปดํฌ๋ํธ์ ์คํ์ผ์ ์ ์ฉํ๋ ํธ๋ฆฌํ ๋ฐฉ๋ฒ์ ์ ๊ณตํ์ง๋ง, ๊ณผ๋ํ๊ฒ ์ฌ์ฉํ๋ฉด ์ฑ๋ฅ ๋ฌธ์ ๋ฅผ ์ผ์ผํฌ ์ ์์ต๋๋ค. ๋ ๋ณต์กํ ์คํ์ผ๋ง ์๋๋ฆฌ์ค์์๋ styled components๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์ ๊ณ ๋ คํ์ธ์.
- `useMemo` ํ ์ฌ์ฉ: ์์ฃผ ์ฌ์ฉ๋๋ ์คํ์ผ์ ๋ฉ๋ชจ์ด์ฆํ์ฌ ๋ถํ์ํ ์ฌ๊ณ์ฐ์ ๋ฐฉ์งํฉ๋๋ค.
- ํ ๋ง ๋ณ์ ์ต์ ํ: ๋ณต์กํ ๊ณ์ฐ์ด๋ ๋น์ฉ์ด ๋ง์ด ๋๋ ์์ ์ ํผํ์ฌ ํ ๋ง ๋ณ์๊ฐ ์ฑ๋ฅ์ ์ต์ ํ๋๋๋ก ํฉ๋๋ค.
- ์ฝ๋ ๋ถํ ์ฌ์ฉ: ์ฝ๋ ๋ถํ ์ ๊ตฌํํ์ฌ ์ด๊ธฐ ๋ฒ๋ค ํฌ๊ธฐ๋ฅผ ์ค์ด๊ณ ๋ก๋ฉ ์ฑ๋ฅ์ ํฅ์์ํต๋๋ค.
CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ํ ์ ๊ณ ๋ ค์ฌํญ
์ฑ๋ฅ์ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ ๋ ๊ณ ๋ คํด์ผ ํ ํ ๊ฐ์ง ์์์ผ ๋ฟ์ ๋๋ค. ๋ค๋ฅธ ์ค์ํ ๊ณ ๋ ค ์ฌํญ์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ฐ๋ฐ์ ๊ฒฝํ: ์ฌ์ฉ์ ์ฉ์ด์ฑ, ํ์ต ๊ณก์ ๋ฐ ์ ๋ฐ์ ์ธ ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ค์ํ ์์์ ๋๋ค. ํ์ ๊ธฐ์ ์์ค๊ณผ ์ ํธ๋์ ๋ง๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ์ธ์.
- ๊ธฐ๋ฅ: ํ ๋ง ์ง์, ์๋ฒ ์ฌ์ด๋ ๋ ๋๋ง ํธํ์ฑ, CSS ์ ์ฒ๋ฆฌ๊ธฐ ํตํฉ๊ณผ ๊ฐ์ ๊ฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ์ ๊ณตํ๋ ๊ธฐ๋ฅ์ ํ๊ฐํ์ธ์.
- ์ปค๋ฎค๋ํฐ ์ง์: ์ปค๋ฎค๋ํฐ์ ๊ท๋ชจ์ ํ๋์ ๊ณ ๋ คํ์ธ์. ์ด๋ ๋ฌธ์, ํํ ๋ฆฌ์ผ, ์๋ํํฐ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ฐ์ฉ์ฑ์ ์ํฅ์ ๋ฏธ์น ์ ์์ต๋๋ค.
- ํ๋ก์ ํธ ์๊ตฌ์ฌํญ: ์ฑ๋ฅ ์ ์ฝ, ํ์ฅ์ฑ ์๊ตฌ, ๊ธฐ์กด ๊ธฐ์ ๊ณผ์ ํตํฉ ๋ฑ ํ๋ก์ ํธ์ ํน์ ์๊ตฌ์ฌํญ๋ ์ ํ์ ์ํฅ์ ๋ฏธ์ณ์ผ ํฉ๋๋ค.
- ํ์ ์๋ จ๋: ๊ฐ๋ฐํ์ด ํน์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋ํด ๊ฐ์ง ๊ธฐ์กด์ ์ ๋ฌธ ์ง์๊ณผ ์น์๋๋ ๊ฒฐ์ ์ ํฐ ๋น์ค์ ๋์ด์ผ ํฉ๋๋ค. ์ฌ๊ต์ก์ ๋น์ฉ๊ณผ ์๊ฐ์ด ๋ง์ด ์์๋ ์ ์์ต๋๋ค.
- ์ฅ๊ธฐ ์ ์ง๋ณด์์ฑ: ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฅ๊ธฐ ์ ์ง๋ณด์์ฑ์ ๊ณ ๋ คํ์ธ์. ํ๋ฐํ๊ฒ ์ ์ง๋ณด์๋๊ณ ์๋์? ์์ ์ ์ธ API๋ฅผ ๊ฐ์ง๊ณ ์๋์? ์ ์ ์ง๋ณด์๋๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ๋ฉด ํฅํ ํธํ์ฑ ๋ฌธ์ ์ ์ํ์ ์ค์ผ ์ ์์ต๋๋ค.
๊ฒฐ๋ก
Styled Components์ Emotion์ ๋ชจ๋ ํ๋ก ํธ์๋ ๊ฐ๋ฐ์ ์๋ง์ ์ด์ ์ ์ ๊ณตํ๋ ๊ฐ๋ ฅํ๊ณ ๋ค์ฌ๋ค๋ฅํ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. Emotion์ด ์ด๊ธฐ ๋ ๋๋ง ์๊ฐ, ์ ๋ฐ์ดํธ ์๊ฐ, ๋ฒ๋ค ํฌ๊ธฐ, ๋ฉ๋ชจ๋ฆฌ ์ฌ์ฉ๋ ์ธก๋ฉด์์ ์ข ์ข ๋ ๋์ ์ฑ๋ฅ์ ๋ณด์ฌ์ฃผ์ง๋ง, Styled Components๋ ์ฌ์ฉ์ ์ฉ์ด์ฑ, ๋ฐฉ๋ํ ๋ฌธ์, ๋๊ท๋ชจ ์ปค๋ฎค๋ํฐ ๋๋ถ์ ์ฌ์ ํ ์ธ๊ธฐ ์๋ ์ ํ์ง์ ๋๋ค. ํ๋ก์ ํธ์ ๊ฐ์ฅ ์ ํฉํ ์ ํ์ ํน์ ์๊ตฌ์ฌํญ, ์ฑ๋ฅ ์ ์ฝ, ๊ฐ๋ฐ์ ์ ํธ๋์ ๋ฐ๋ผ ๋ฌ๋ผ์ง๋๋ค.
๊ถ๊ทน์ ์ผ๋ก, ์ต์ข ๊ฒฐ์ ์ ๋ด๋ฆฌ๊ธฐ ์ ์ ์์ ์ ์ ํ๋ฆฌ์ผ์ด์ ํ๊ฒฝ์์ ๋ฒค์น๋งํน์ ํฌํจํ์ฌ ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ฒ ์ ํ ํ๊ฐํ๋ ๊ฒ์ด ์ข์ต๋๋ค. Styled Components์ Emotion์ ์ฑ๋ฅ ํน์ฑ, ๊ธฐ๋ฅ, ๊ฐ๋ฐ์ ๊ฒฝํ์ ์ ์คํ๊ฒ ๊ณ ๋ คํจ์ผ๋ก์จ ํ๋ก์ ํธ์ ์๊ตฌ์ ๊ฐ์ฅ ์ ํฉํ๊ณ ๊ณ ์ฑ๋ฅ์ ์ ์ง๋ณด์ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ธฐ์ฌํ๋ CSS-in-JS ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ํํ ์ ์์ต๋๋ค. ํน์ ์ปจํ ์คํธ์ ๊ฐ์ฅ ์ ํฉํ ์๋ฃจ์ ์ ์ฐพ๊ธฐ ์ํด ์คํํ๊ณ ๋ฐ๋ณตํ๋ ๊ฒ์ ๋๋ ค์ํ์ง ๋ง์ธ์. CSS-in-JS ํ๊ฒฝ์ ๋์์์ด ์งํํ๊ณ ์์ผ๋ฏ๋ก, ์ต์ ์ฑ๋ฅ ์ต์ ํ ๋ฐ ๋ชจ๋ฒ ์ฌ๋ก์ ๋ํ ์ ๋ณด๋ฅผ ์ ์งํ๋ ๊ฒ์ด ํจ์จ์ ์ด๊ณ ํ์ฅ ๊ฐ๋ฅํ ์น ์ ํ๋ฆฌ์ผ์ด์ ์ ๊ตฌ์ถํ๋ ๋ฐ ์ค์ํฉ๋๋ค.